1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.apache.geronimo.ews.ws4j2ee.toWs.dd;
17
18 import org.apache.axis.encoding.SerializationContext;
19 import org.apache.axis.wsdl.fromJava.Emitter;
20 import org.apache.geronimo.ews.ws4j2ee.context.J2EEWebServiceContext;
21 import org.apache.geronimo.ews.ws4j2ee.toWs.GenerationFault;
22 import org.apache.geronimo.ews.ws4j2ee.toWs.UnrecoverableGenerationFault;
23 import org.apache.geronimo.ews.ws4j2ee.toWs.Writer;
24 import org.apache.geronimo.ews.ws4j2ee.utils.Utils;
25
26 import javax.wsdl.Binding;
27 import javax.wsdl.Operation;
28 import javax.wsdl.Part;
29 import javax.wsdl.Port;
30 import javax.wsdl.Service;
31 import javax.xml.namespace.QName;
32 import java.io.IOException;
33 import java.lang.reflect.Method;
34 import java.util.HashMap;
35 import java.util.Iterator;
36 import java.util.Map;
37
38 /***
39 * @author Srinath Perera(hemapani@opensource.lk)
40 */
41 public class JaxRpcMappingFileWriter implements Writer {
42 private SerializationContext sc;
43 private String ns = "http://java.sun.com/xml/ns/j2ee";
44 private Emitter emitter;
45 private J2EEWebServiceContext j2eewscontext;
46
47 public JaxRpcMappingFileWriter(java.io.Writer out,
48 Emitter emitter,
49 J2EEWebServiceContext j2eewscontext) {
50 if (out == null) {
51 throw new UnrecoverableGenerationFault(out + " The writer is null");
52 }
53 sc = new SerializationContext(out);
54 sc.setPretty(true);
55 this.emitter = emitter;
56 this.j2eewscontext = j2eewscontext;
57 }
58
59 private void writePackageMapping() throws IOException {
60 String jaxrpcsei = j2eewscontext.getMiscInfo().getJaxrpcSEI();
61 Map map = emitter.getNamespaceMap();
62 String val = null;
63 if (map != null) {
64 Iterator packages = map.keySet().iterator();
65 while (packages.hasNext()) {
66 String pkg = (String) packages.next();
67 if (pkg == null) {
68
69
70 String pkgName = Utils.getPackageNameFromQuallifiedName(jaxrpcsei);
71 val = (String) map.get(pkgName);
72 if (val == null) {
73 val = Utils.javapkgToURI(pkgName);
74 } else {
75 continue;
76 }
77 } else if (pkg.equals(jaxrpcsei)) {
78 continue;
79 } else {
80 val = (String) map.get(pkg);
81 }
82
83 if (pkg != null) {
84 sc.startElement(new QName(ns, "package-mapping"), null);
85 sc.startElement(new QName(ns, "package-type"), null);
86 sc.writeString(pkg);
87 sc.endElement();
88 sc.startElement(new QName(ns, "namespaceURI"), null);
89 sc.writeString(val);
90 sc.endElement();
91 sc.endElement();
92 }
93 }
94 }
95 }
96
97 public void writeServiceMapping() throws IOException {
98 Service service = j2eewscontext.getWSDLContext().gettargetService().getService();
99 sc.startElement(new QName(ns, "service-interface-mapping"), null);
100 String name = emitter.getCls().getName();
101 int index = name.lastIndexOf('.');
102 String packageName = "";
103 if (index > 0)
104 packageName = name.substring(0, index + 1);
105 sc.startElement(new QName(ns, "service-interface"), null);
106 sc.writeString(packageName + emitter.getServiceElementName());
107 sc.endElement();
108 sc.registerPrefixForURI("ns1", service.getQName().getNamespaceURI());
109 sc.startElement(new QName(ns, "wsdl-service-name"), null);
110 sc.writeString("ns1:" + service.getQName().getLocalPart());
111 sc.endElement();
112
113
114 Port wsdlport = j2eewscontext.getWSDLContext().getTargetPort();
115 sc.startElement(new QName(ns, "port-mapping"), null);
116 sc.startElement(new QName(ns, "port-name"), null);
117 sc.writeString(wsdlport.getName());
118 sc.endElement();
119 sc.startElement(new QName(ns, "java-port-name"), null);
120 sc.writeString(emitter.getServicePortName());
121 sc.endElement();
122 sc.endElement();
123 sc.endElement();
124 }
125
126 private void writeReturnTypes(HashMap methods, Operation op) throws IOException {
127
128 Method mtd = (Method) methods.get(op.getName());
129 Class ret = mtd.getReturnType();
130 if (ret != null && !("void".equals(ret.toString()))) {
131
132 Map parts = op.getOutput().getMessage().getParts();
133 if (parts != null) {
134 Iterator partIt = parts.values().iterator();
135 while (partIt.hasNext()) {
136
137 QName messagename = op.getOutput().getMessage().getQName();
138
139
140 sc.startElement(new QName(ns, "wsdl-return-value-mapping"), null);
141 sc.startElement(new QName(ns, "method-return-value"), null);
142 sc.writeString(ret.getName());
143 sc.endElement();
144 sc.registerPrefixForURI("ns1", messagename.getNamespaceURI());
145 sc.startElement(new QName(ns, "wsdl-message"), null);
146 sc.writeString("ns1:" + messagename.getLocalPart());
147 sc.endElement();
148 sc.startElement(new QName(ns, "wsdl-message-part-name"), null);
149 sc.writeString(((Part) partIt.next()).getName());
150 sc.endElement();
151 sc.endElement();
152 }
153 }
154 }
155 }
156
157 private void writeParametParts(HashMap methods, Operation op) throws IOException {
158 int position = 0;
159 Class[] params = ((Method) methods.get(op.getName())).getParameterTypes();
160 Iterator parmIt = null;
161 Map parameters = op.getInput().getMessage().getParts();
162 if (parameters != null) {
163 parmIt = parameters.values().iterator();
164 }
165 while (parmIt != null && parmIt.hasNext()) {
166 Part part = (Part) parmIt.next();
167 sc.startElement(new QName(ns, "method-param-parts-mapping"), null);
168
169
170 sc.startElement(new QName(ns, "param-position"), null);
171 sc.writeString(Integer.toString(position));
172 sc.endElement();
173
174 sc.startElement(new QName(ns, "param-type"), null);
175 sc.writeString(params[position].getName());
176 sc.endElement();
177
178
179 sc.startElement(new QName(ns, "wsdl-message-mapping"), null);
180 QName messagename = op.getInput().getMessage().getQName();
181 sc.registerPrefixForURI("ns1", messagename.getNamespaceURI());
182 sc.startElement(new QName(ns, "wsdl-message"), null);
183 sc.writeString(messagename.getLocalPart());
184 sc.endElement();
185 sc.startElement(new QName(ns, "wsdl-message-part-name"), null);
186 sc.writeString(part.getName());
187 sc.endElement();
188 sc.startElement(new QName(ns, "parameter-mode"), null);
189 sc.writeString("IN");
190 sc.endElement();
191 sc.endElement();
192 sc.endElement();
193 }
194 }
195
196 private void writeMethodMapping(Binding binding) throws IOException {
197
198 Iterator ops = binding.getPortType().getOperations().iterator();
199 while (ops.hasNext()) {
200 Operation op = (Operation) ops.next();
201 sc.startElement(new QName(ns, "service-endpoint-method-mapping"), null);
202
203
204 sc.startElement(new QName(ns, "java-method-name"), null);
205 sc.writeString(op.getName());
206 sc.endElement();
207 sc.startElement(new QName(ns, "wsdl-operation"), null);
208 sc.writeString(op.getName());
209 sc.endElement();
210 HashMap methods = new HashMap();
211 Method[] javamethods = emitter.getCls().getMethods();
212 for (int i = 0; i < javamethods.length; i++) {
213 methods.put(javamethods[i].getName(), javamethods[i]);
214 }
215 writeReturnTypes(methods, op);
216
217 sc.endElement();
218 }
219 }
220
221 public void write() throws GenerationFault {
222 try {
223 sc.startElement(new QName(ns, "java-wsdl-mapping"), null);
224 writePackageMapping();
225 writeServiceMapping();
226
227 Port wsdlport = j2eewscontext.getWSDLContext().getTargetPort();
228 Binding binding = wsdlport.getBinding();
229 if (binding == null)
230 throw new UnrecoverableGenerationFault("no port discription not match with the wsdl file");
231 sc.startElement(new QName(ns, "service-endpoint-interface-mapping"), null);
232 sc.startElement(new QName(ns, "service-endpoint-interface"), null);
233 sc.writeString(emitter.getCls().getName());
234 sc.endElement();
235 sc.registerPrefixForURI("ns2", binding.getQName().getNamespaceURI());
236 sc.startElement(new QName(ns, "wsdl-binding"), null);
237 sc.writeString("ns2:" + binding.getQName().getLocalPart());
238 sc.endElement();
239 QName ptName = binding.getPortType().getQName();
240 sc.registerPrefixForURI("ns3", ptName.getNamespaceURI());
241 sc.startElement(new QName(ns, "wsdl-port-type"), null);
242 sc.writeString("ns3:" + ptName.getLocalPart());
243 sc.endElement();
244 writeMethodMapping(binding);
245 sc.endElement();
246 sc.endElement();
247 } catch (IOException e) {
248
249 e.printStackTrace();
250 }
251 }
252
253 }